package co.edu.udea.herbario.dao.imp;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.herbario.dao.EspecieDao;
import co.edu.udea.herbario.dto.Especie;
import co.edu.udea.herbario.excepcion.Excepcion;

/**
 * Esta clase contiene la implementacion de los metodos planteados en la interface EspecieDao,
 * los cuales son utilizados para gestionar los datos de persistencia asociados a las especies 
 * registradas en el sistema
 * 
 * @author Lorena Orozco
 *
 */

public class EspecieDaoImp extends HibernateDaoSupport implements EspecieDao
{
	@Override
	public Especie obtener(int cod) throws Excepcion
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Especie esp = null;	//inicializacion de objeto tipo Especie para almacenar el 
							//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Especie asociado al codigo pasado como parametro
			esp = (Especie)sesion.get(Especie.class, cod);
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return esp;	//retorna el elemento hallado en la tabla Especie
	}

	@Override
	public int crear(Especie esp) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//crea el elemento esp en la tabla Especie
			getHibernateTemplate().save(esp);
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa			
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);			
		}
		
		return res;	//retorna el valor de exito o fallo de la operacion
	}

	@Override
	public int eliminar(Especie esp) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//Modifica el estado del elemento de tipo Especie dentro del sistema
			esp.setActivo(false);	//Se indica que la especie esta inactiva
			getHibernateTemplate().update(esp);	//actualiza la informacion del elemento de tipo Especie
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa			
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);				
		}

		return res;	//retorna el valor de exito o fallo de la operacion
	}

	@Override
	public Especie obtenerEspeciePorNombre(String nom) throws Excepcion
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Especie esp = null;	//inicializacion de objeto tipo Especie para almacenar el 
							//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Especie asociado al nombre pasado como parametro
			//se utiliza el metodo uniqueResult() ya que el nombre de la especie debe aparecer una sola vez
			//en la tabla Especie
			esp = (Especie) sesion.createCriteria(Especie.class).add(Restrictions.eq("nombreEspecie", nom)).uniqueResult();
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return esp;	//retorna el elemento hallado en la tabla Especie
	}
}
